#!/usr/bin/env python3
"""
Excel 查看器路由
支持上传Excel文件并解析展示
"""

from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required, get_jwt_identity
import pandas as pd
import io
import os
from werkzeug.utils import secure_filename

bp = Blueprint('excel_viewer', __name__)

# 允许的文件扩展名
ALLOWED_EXTENSIONS = {'xls', 'xlsx', 'csv'}

def allowed_file(filename):
    """检查文件扩展名是否允许"""
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS


# ==================== POST - 上传并解析Excel ====================
@bp.route('/upload', methods=['POST'])
@jwt_required()
def upload_excel():
    """上传并解析Excel文件"""
    try:
        current_user_id = int(get_jwt_identity())
        
        # 检查是否有文件
        if 'file' not in request.files:
            return jsonify({
                'success': False,
                'error': '没有上传文件'
            }), 400
        
        file = request.files['file']
        
        # 检查文件名
        if file.filename == '':
            return jsonify({
                'success': False,
                'error': '文件名为空'
            }), 400
        
        # 检查文件类型
        if not allowed_file(file.filename):
            return jsonify({
                'success': False,
                'error': '只支持 .xls, .xlsx, .csv 格式的文件'
            }), 400
        
        # 读取文件内容
        filename = secure_filename(file.filename)
        file_ext = filename.rsplit('.', 1)[1].lower()
        
        # 使用pandas读取Excel
        try:
            if file_ext == 'csv':
                df = pd.read_csv(io.BytesIO(file.read()), encoding='utf-8')
            else:
                df = pd.read_excel(io.BytesIO(file.read()), engine='openpyxl')
            
            # 处理NaN值，替换为空字符串
            df = df.fillna('')
            
            # 获取列名
            columns = df.columns.tolist()
            
            # 转换数据为列表格式
            data = df.to_dict('records')
            
            # 获取基本统计信息
            stats = {
                'rows': len(df),
                'columns': len(columns),
                'filename': filename,
            }
            
            return jsonify({
                'success': True,
                'data': {
                    'columns': columns,
                    'rows': data,
                    'stats': stats
                },
                'message': f'成功解析文件：{filename}'
            }), 200
            
        except Exception as e:
            return jsonify({
                'success': False,
                'error': f'解析文件失败：{str(e)}'
            }), 400
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500


# ==================== POST - 解析预览 ====================
@bp.route('/preview', methods=['POST'])
@jwt_required()
def preview_excel():
    """预览Excel文件（仅返回前10行）"""
    try:
        current_user_id = int(get_jwt_identity())
        
        if 'file' not in request.files:
            return jsonify({
                'success': False,
                'error': '没有上传文件'
            }), 400
        
        file = request.files['file']
        
        if file.filename == '' or not allowed_file(file.filename):
            return jsonify({
                'success': False,
                'error': '无效的文件'
            }), 400
        
        filename = secure_filename(file.filename)
        file_ext = filename.rsplit('.', 1)[1].lower()
        
        try:
            # 读取文件（仅前10行用于预览）
            if file_ext == 'csv':
                df = pd.read_csv(io.BytesIO(file.read()), encoding='utf-8', nrows=10)
            else:
                df = pd.read_excel(io.BytesIO(file.read()), engine='openpyxl', nrows=10)
            
            df = df.fillna('')
            
            columns = df.columns.tolist()
            data = df.to_dict('records')
            
            return jsonify({
                'success': True,
                'data': {
                    'columns': columns,
                    'rows': data,
                    'preview': True
                },
                'message': '预览前10行数据'
            }), 200
            
        except Exception as e:
            return jsonify({
                'success': False,
                'error': f'预览失败：{str(e)}'
            }), 400
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500


# ==================== GET - 获取支持的格式 ====================
@bp.route('/formats', methods=['GET'])
@jwt_required()
def get_formats():
    """获取支持的文件格式"""
    try:
        return jsonify({
            'success': True,
            'data': {
                'formats': list(ALLOWED_EXTENSIONS),
                'description': {
                    'xls': 'Microsoft Excel 97-2003',
                    'xlsx': 'Microsoft Excel 2007+',
                    'csv': 'Comma-Separated Values'
                }
            }
        }), 200
        
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500

